home *** CD-ROM | disk | FTP | other *** search
-
- {Here is the code I promised to sent you. It works nice. You can read
- any part of the real-mode low memory with it.}
-
- function allocRealModePointer(var P: pointer; Size: longInt): boolean;
- var
- Selector,
- base : word;
- LinearBase : longint;
- begin
- result := false;
- LinearBase := MakeLong(0,hiword(longint(p)) shr 12) +
- hiword(longint(P)) shl 4 + loword(longint(P));
- {converts 20-bit address into a 32-bit one}
- {i.e. $ffff:0006 into $000ffff6}
- Selector := AllocSelector(DSeg); {Copies DSeg Selector properties }
- base := SetSelectorBase(Selector, LinearBase);
- SetSelectorLimit(Selector, Size);
- if (Selector <> 0) and (base<>0) then begin
- P := Ptr(Selector, 0);
- result := true;
- end;
- end;
-
- function freeRealModePointer(var p: pointer): boolean;
- var
- fr : Word;
- begin
- fr := FreeSelector(hiword(longint(p)));
- {seletor is at hiword(p)}
- if (fr=0) then begin {ok}
- p := nil;
- result := true;
- end else begin {fail}
- result := false;
- end;
- end;
-
- { code Test: The Rom-Bios' date is allways at $ffff:0005 (real-mode)}
-
- var
- P: pChar;
- begin
- P := Ptr($FFFF, $0005); {FFFF5 -> data da Rom-Bios}
- if AllocRealModePointer(Pointer(p), 8) then {8 chars to RomBios' date}
- begin
- { Use p to read ROM Bios' date here}
- FreeRealModePointer(Pointer(p)); {dispose p}
- end;
- end.